package com.gem.day15;

/**
 * 本类用来演示Java创建线程的两种方式之一:
 * 写一个类继承java.lang.Thread类并且重写它的run()方法
 * 
 * @author easonsy
 * 2020年8月10日 上午8:57:22
 */
public class ThreadDemo1 {
	public static void main(String[] args) {
		//创建线程对象
		T1 t1 = new T1("线程1");//线程状态:初始态
		T1 t2 = new T1("线程2");

		//设置线程名字
		//注意:还可以通过Thread构造方法来设置线程名字
		//t1.setName("线程1");
		//t2.setName("线程2");

		//获取线程优先级
		//System.out.println(t1.getPriority());

		/*
		 * 设置线程优先级
		 * 线程优先级有十级(1~10),1表示最小优先级,10表示最大优先级,默认优先级为5
		 * 分别对应常量MIN_PRIORITY,NORM_PRIORITY,MAX_PRIORITY
		 * 
		 * 注意:
		 * 线程优先级只能在某种程度上干预线程执行的先后顺序,并不能100%保证高优先级的线程一定先执行!
		 */
		//t1.setPriority(1);
		t1.setPriority(Thread.MIN_PRIORITY);
		//t2.setPriority(10);
		t2.setPriority(Thread.MAX_PRIORITY);

		/*
		 * 设置守护线程 
		 * 守护线程是伴随系统启动而启动运行在后台监控,程序退出时也即时退出
		 * 
		 * 注意:
		 * 守护线程必须在启动之前设置,否则抛出异常:java.lang.IllegalThreadStateException
		 * JVM中有两个重要的守护线程: 
		 * main		负责调用main方法
		 * gc			负责垃圾回收处理
		 */
		//t1.setDaemon(true);

		//启动线程
		//注意:启动线程的方法是start(),呼叫JVM使用系统函数来调度run()方法
		//注意:Java线程使用抢占式调用方式
		t1.start();//线程状态:就绪态[不代表线程正在执行,当抢到CPU资源是才能运行]
		t2.start();
	}
}

//Java线程类
class T1 extends Thread {
	public T1(String name) {
		super(name);
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			//获取线程名字
			System.out.println(Thread.currentThread().getName() + " : " + i);
			//线程睡眠1s
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
